package com.lqian.juc;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 使用：一个或者一组线程在开始执行操作之前，必须要等到其他线程执行完才可以。
 * 举个栗子：在考试的时候，老师必须要等到所有人交了试卷才可以走。
 * 此时老师就相当于等待线程，而学生就好比是执行的线程。
 * @author：Melody_LQ
 * @time：2022/8/13 12:33 下午
 */
public class CountDownLatchDemo {

    //1、定义一个CountDownLatch，并设置值为2
    static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) {

        System.out.println("全班开始考试：一共有两名学生");
        // 学生1
        new Thread(()->{
            System.out.println("第一个学生，考试完成，交卷，countDownLatch减1");
            countDownLatch.countDown();
        }).start();

        // 学生2
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println("第二个学生，考试完成，交卷，countDownLatch减1");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            countDownLatch.countDown();
        }).start();

        try{
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 两个学生使用两个线程来表示，然后依次执行。最后老师线程（main线程）在学生线程都执行完了才可以执行。
        System.out.println("老师清点试卷，如果有一个人没交，countDownLatch不为0，就不能结束考试离场");
    }
}
